//
// Created by tacom on 22-9-1.
//

#ifndef CVCUDAIMPL_CNFD_CUH
#define CVCUDAIMPL_CNFD_CUH

#include "ApplicationConfig.h"
#include "opencv2/opencv.hpp"
#include "iostream"
#include "cuda_runtime.h"

/**
 * opencv_version: 4.6.0
 *  - 这个版本刚实现cuda版本的connectedComponent, 并未实现withStatus
 *  - 所以CNFD将会实现两个版本，一个是用cuda运算进行实现，一个则将传入的大图在cpu上加速实现
 * @param InputMat BigMat from python
 * @param OutputMat labeled BigMat
 * @param h 子图高
 * @param w 子图宽
 * @param CNFDList CNFD计算值
 */
void CNFDCudaWrapper(cv::cuda::GpuMat &inputMat, cv::cuda::GpuMat &outputMat,
                     int h, int w, int stride, std::vector<std::vector<int>> &matrixShape,
                     std::vector<unsigned int> &CNFDList);
void GetConnected(cv::cuda::GpuMat &inputMat, cv::cuda::GpuMat &outputMat);
void colorLabelsCpu(const cv::Mat &labels, cv::Mat &colors);
__global__ void colorLabelGpu(cv::cuda::PtrStepSz<int> labels, cv::cuda::PtrStepSz<uchar3> colors);
/**
 * 统计GpuMat中不同的数值类型
 *  - 没有找到合适的Cuda映射表数据结构，只能下载到Cpu中，通过指针访问
 *  - 延迟从0.07提升到了0.24  每15张图片, Rtx 2050, i7-12700H
 * @param gpuMat
 * @return
 */
unsigned int findMatMaxValue(cv::cuda::GpuMat &gpuMat);

#endif //CVCUDAIMPL_CNFD_CUH
